package com.aopStudy.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Modifier;

/*
此类中演示在增强方法中获取目标方法的信息

切点表达式
固定语法execution(1 2 3.4.5(6))
1：访问修饰符，如public、private...
2：返回值类型，如String、int...
如果不考虑访问修饰符和返回值！这两位整合一起写execution(* 3 4 5(6))
要是不考虑，必须两者都不考虑！不能出现* String
3：包的位置。
模糊表达
单层模糊：*如com.aopStudy.service.*
多层模糊：..如com..impl，表示com和impl中间层任意
不可..开头，找所有impl包：不能写成..impl，要写成com..impl
4：类的位置。
如com.aopStudy.service.impl
模糊表达
完全模糊：*
部分模糊：*impl，表示以impl结尾
5：方法的位置
表达同上
(6)：方法的参数列表
模糊表达
完全模糊：(..)参数任意
部分模糊：
(String...)String后面任意
(...int)最后一个参数是int
(String...int)第一个为String，最后一个为int，中间任意

 */
@Aspect
public class LogAdvice1 {

    // 表达式解释补充：com..impl中的..表示com和impl中间层任意，只要是com下的impl包下的类都包含进来
    // 1、获取目标方法的基本信息
    @Before("execution(* com..impl.*.*(..))")
    public void start(JoinPoint joinPoint) {
        // 获取目标方法所属类的信息
        Object target = joinPoint.getTarget();
        String simpleName = target.getClass().getSimpleName();
        // 获取目标方法名
        String methodName = joinPoint.getSignature().getName();
        // 获取目标方法的访问修饰符
        int modifiers = joinPoint.getSignature().getModifiers();
        String strModifiers = Modifier.toString(modifiers);
        // 获取目标方法的参数
        Object[] args = joinPoint.getArgs();


    }

    // 2、获取目标方法的返回值，只有@AfterReturning能获取
    @AfterReturning(value = "execution(* com..impl.*.*(..))", returning = "returnValue")
    public void afterReturning(JoinPoint joinPoint, Object returnValue) {

    }

    @After("execution(* com..impl.*.*(..))")
    public void after() {

    }

    // 3、获取目标方法的异常信息，只有@AfterThrowing能获取
    @AfterThrowing(value = "execution(* com..impl.*.*(..))", throwing = "throwable")
    public void afterThrowing(Throwable throwable) {

    }
}
